package pe.com.casadesign.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;

import pe.com.casadesign.dao.ReporteDAO;
import pe.com.casadesign.domain.Item;
import pe.com.casadesign.domain.LineaReporteVenta;
import pe.com.casadesign.domain.LineaReporteVentaDetalle;
import pe.com.casadesign.domain.LineaReporteInventario;
import pe.com.casadesign.domain.LineaReporteProducto;
import pe.com.casadesign.domain.LineaReporteGuia;
import pe.com.casadesign.domain.LineaReporteGuiaCabecera;
import pe.com.casadesign.domain.LineaReporteProveedor;
import pe.com.casadesign.domain.ListaLineaReporteVenta;
import pe.com.casadesign.domain.ListaLineaReporteVentaDetalle;
import pe.com.casadesign.domain.ListaLineaReporteInventario;
import pe.com.casadesign.domain.ListaLineaReporteProducto;
import pe.com.casadesign.domain.ListaLineaReporteProveedor;
import pe.com.casadesign.domain.ListaLineaReporteGuia;
import pe.com.casadesign.domain.ListaLineaReporteGuiaCabecera;
import pe.com.casadesign.domain.ReporteInventario;
import pe.com.casadesign.domain.ReporteProducto;
import pe.com.casadesign.domain.ReporteProveedor;
import pe.com.casadesign.domain.ReporteVenta;
import pe.com.casadesign.domain.ReporteVentaDetalle;
import pe.com.casadesign.domain.ReporteGuia;
import pe.com.casadesign.domain.ReporteGuiaCabecera;
import pe.com.casadesign.domain.Venta;
import pe.com.casadesign.domain.Inventario;
import pe.com.casadesign.domain.Producto;
import pe.com.casadesign.domain.TipoDocumentoVenta;
import pe.com.casadesign.domain.Cliente;
import pe.com.casadesign.domain.Tienda;
import pe.com.casadesign.domain.Usuario;
import pe.com.casadesign.domain.Diseniador;
import pe.com.casadesign.domain.ReporteSolicitud;
import pe.com.casadesign.domain.NivelProducto;
import pe.com.casadesign.domain.NivelTipo;
import pe.com.casadesign.domain.NivelColor;
import pe.com.casadesign.domain.NivelMaterial;
import pe.com.casadesign.domain.Proveedor;
import pe.com.casadesign.domain.Pais;
import pe.com.casadesign.domain.Guia;
import pe.com.casadesign.domain.LineaGuia;
import pe.com.casadesign.domain.LineaVenta;
import pe.com.casadesign.domain.AjusteInventario;
import pe.com.casadesign.domain.ListaLineaAjusteInventario;
import pe.com.casadesign.domain.LineaAjusteInventario;


/**
 * Implementacion de ReporteDAO.
 * 
 * @author GS1
 * 
 */
@Repository
public class ReporteDAOImpl implements ReporteDAO {
	private static final Logger logger = LoggerFactory
			.getLogger(ReporteDAOImpl.class);

   // Nombre Procedimientos Almacenados
	private static String SP_REPORTE_INVENTARIO_VALORIZADO = "SP_REPORTE_INVENTARIO_VALORIZADO";
	private static String SP_REPORTE_INVENTARIO_SISTEMA = "SP_REPORTE_INVENTARIO_SISTEMA";
	private static String SP_REPORTE_VENTAS_X_FECHA = "SP_REPORTE_VENTAS_X_FECHA";
	private static String SP_REPORTE_VENTAS_X_PRODUCTO = "SP_REPORTE_VENTAS_X_PRODUCTO";
	private static String SP_REPORTE_VENTAS_X_CLIENTE = "SP_REPORTE_VENTAS_X_CLIENTE";
	private static String SP_REPORTE_VENTAS_X_DECORADOR = "SP_REPORTE_VENTAS_X_DECORADOR";
	private static String SP_REPORTE_PRODUCTO_X_ORIGEN = "SP_REPORTE_PRODUCTO_X_ORIGEN";
	private static String SP_REPORTE_PRODUCTO_X_PROVEEDOR = "SP_REPORTE_PRODUCTO_X_PROVEEDOR";
	private static String SP_REPORTE_DESPACHOS_X_TIENDA = "SP_REPORTE_DESPACHOS_X_TIENDA";
	private static String SP_REPORTE_CONTENIDO_GUIA = "SP_REPORTE_CONTENIDO_GUIA";
	private static String SP_REPORTE_PRESTAMOS_X_TIENDA = "SP_REPORTE_PRESTAMOS_X_TIENDA";
	private static String SP_REPORTE_PROVEEDOR_X_PAIS = "SP_REPORTE_PROVEEDOR_X_PAIS";
	private static String SP_REPORTE_CONTENIDO_FACTURA = "SP_REPORTE_CONTENIDO_FACTURA";
	private static String SP_AJUSTE_SOBRANTES_X_TIENDA = "SP_AJUSTE_SOBRANTES_X_TIENDA";
	private static String SP_AJUSTE_FALTANTES_X_TIENDA = "SP_AJUSTE_FALTANTES_X_TIENDA";
	private static String SP_LISTAR_PRODUCTO_ITEMS_SOBRANTES = "SP_LISTAR_PRODUCTO_ITEMS_SOBRANTES";
	private static String SP_LISTAR_PRODUCTO_ITEMS_FALTANTES = "SP_LISTAR_PRODUCTO_ITEMS_FALTANTES";

	// Parametros de Entrada
	private static String PARAM_CODTIENDA = "p_codtienda";
	private static String PARAM_CODINVENTARIO = "p_codinventario";

	private static String PARAM_FECHAINICIO = "p_fechainicio";
	private static String PARAM_FECHAFIN = "p_fechafin";
	private static String PARAM_CODPRODUCTO = "p_codproducto";
	private static String PARAM_CODCLIENTE = "p_codcliente";
	private static String PARAM_CODDISENIADOR = "p_coddiseniador";

	private static String PARAM_TIPOORIGEN = "p_tipoorigen";
	private static String PARAM_CODPROVEEDOR = "p_codproveedor";

	private static String PARAM_SERIE = "p_serie";
	private static String PARAM_NUMERO = "p_numero";
	private static String PARAM_CODTIPODOCUMENTOVENTA = "p_codtipodocumentoventa";
	
	private static String PARAM_CODPAIS = "p_codpais";
	private static String PARAM_CODNIVELTIPO = "p_codniveltipo";
	private static String PARAM_CODNIVELPROD = "p_codnivelprod";

	// Parametros de Salida
	private static String INVENTARIO_CODTIENDA = "CODTIENDA";
	private static String INVENTARIO_TIENDA = "TIENDA";
	private static String INVENTARIO_CODINVENTARIO = "CODINVENTARIO";
	private static String INVENTARIO_CODPRODUCTO = "CODPRODUCTO";
	private static String INVENTARIO_DESCRIPCION = "DESCRIPCION";
	private static String INVENTARIO_PRECIO = "PRECIO";
	private static String INVENTARIO_STOCKSISTEMA = "STOCKSISTEMA";
	private static String INVENTARIO_STOCKINVENTARIO = "STOCKINVENTARIO";

	private static String VENTA_TIPO_DOCUMENTO = "TIPO_DOCUMENTO";
	private static String VENTA_SERIE = "SERIE";
	private static String VENTA_NUMERO = "NUMERO";
	private static String VENTA_RAZONSOCIAL = "RAZONSOCIAL";
	private static String VENTA_NOMDECORADOR = "NOMDECORADOR";
	private static String VENTA_NOMVENDEDOR = "NOMVENDEDOR";
	private static String VENTA_APEVENDEDOR = "APEVENDEDOR";
	private static String VENTA_ENTREGADO = "ENTREGADO";
	private static String VENTA_SUBTOTAL = "SUBTOTAL";
	private static String VENTA_IGV = "IGV";
	private static String VENTA_TOTAL = "TOTAL";
	private static String VENTA_CODTIENDA = "CODTIENDA";
	private static String VENTA_NOMTIENDA = "NOMTIENDA";
	
	private static String VENTA_CODPRODUCTO = "CODPRODUCTO";
	private static String VENTA_CODPRODUCTOPROVEEDOR = "CODPRODUCTOPROVEEDOR";
	private static String VENTA_DESCRIPCION = "DESCRIPCION";
	private static String VENTA_CANTIDAD = "CANTIDAD";
	private static String VENTA_PRECIO = "PRECIO";

	private static String PRODUCTO_CODPRODUCTO = "CODPRODUCTO";
	private static String PRODUCTO_DESCRIPCION = "DESCRIPCION";
	private static String PRODUCTO_PRECIOVENTAMINIMO = "PRECIOVENTAMINIMO";
	private static String PRODUCTO_PRECIOVENTAMAXIMO = "PRECIOVENTAMAXIMO";
	private static String PRODUCTO_ALTO = "ALTO";
	private static String PRODUCTO_ANCHO = "ANCHO";
	private static String PRODUCTO_LARGO = "LARGO";
	private static String PRODUCTO_NIVELPRODUCTO = "NIVELPRODUCTO";
	private static String PRODUCTO_NIVELTIPO = "NIVELTIPO";
	private static String PRODUCTO_NIVELMATERIAL = "NIVELMATERIAL";
	private static String PRODUCTO_NIVELCOLOR = "NIVELCOLOR";
	private static String PRODUCTO_RAZONSOCIAL = "RAZONSOCIAL";
	private static String PRODUCTO_CODPRODUCTOPROVEEDOR = "CODPRODUCTOPROVEEDOR";
	private static String PRODUCTO_COMPONENTES = "COMPONENTES";
	private static String PRODUCTO_ESTADO = "ESTADO";
	private static String PRODUCTO_PAIS = "PAIS";

	private static String GUIA_SERIE = "SERIE";
	private static String GUIA_NUMERO = "NUMERO";
	private static String GUIA_DESTINO = "DESTINO";
	private static String GUIA_DESPACHADO = "DESPACHADO";
	private static String GUIA_MOVILIDADPROPIA = "MOVILIDADPROPIA";
	private static String GUIA_DOCUMENTOVENTA = "DOCUMENTOVENTA";
	private static String GUIA_CODTIENDAORIGEN = "CODTIENDAORIGEN";
	private static String GUIA_TIENDAORIGEN = "TIENDAORIGEN";
	private static String GUIA_FECHAEMISION = "FECHAEMISION";
	private static String GUIA_CODPRODUCTO = "CODPRODUCTO";
	private static String GUIA_CODPRODUCTOPROVEEDOR = "CODPRODUCTOPROVEEDOR";
	private static String GUIA_DESCRIPCION = "DESCRIPCION";
	private static String GUIA_CANTIDAD = "CANTIDAD";
	private static String GUIA_FECHAFIN = "FECHAFIN";
	
	private static String PROVEEDOR_CODPROVEEDOR = "CODPROVEEDOR";
	private static String PROVEEDOR_RAZONSOCIAL = "RAZONSOCIAL";
	private static String PROVEEDOR_OBSERVACION = "OBSERVACION";
	private static String PROVEEDOR_DIRECCION = "DIRECCION";
	
	private static String AJUSTE_CODPRODUCTO = "CODPRODUCTO";
	private static String AJUSTE_CODPRODUCTOPROVEEDOR= "CODPRODUCTOPROVEEDOR";
	private static String AJUSTE_DESCRIPCION = "DESCRIPCION";
	private static String AJUSTE_TIENDA = "TIENDA";
	private static String AJUSTE_CANTIDADFALTANTES = "CANTIDADFALTANTES"; 
	private static String AJUSTE_CANTIDADSOBRANTES = "CANTIDADSOBRANTES"; 
    private static String AJUSTE_CODTIENDA = "CODTIENDA";

    private static String LISTAITEM_CODITEM = "CODITEM";
    private static String LISTAITEM_CODIFICACION = "CODIFICACION";

		
	private static String LISTADO = "LISTADO";
	private static String LISTADO_LINEAS = "LISTADO_LINEAS";

	private static String TOTAL_FILAS_AFECTADAS = "#update-count-1";

	private JdbcTemplate jdbcTemplate;

	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public ReporteInventario obtenerReporteInventario(Inventario inventario) {
		logger.info("obtenerReporteInventario");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_REPORTE_INVENTARIO_VALORIZADO)
				.returningResultSet(LISTADO, new RowMapper<ReporteInventario>() {
							@Override
							public ReporteInventario mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final ReporteInventario reporteInventario = new ReporteInventario();

								Inventario inventario = new Inventario();
								inventario.setCodInventario(rs.getInt(INVENTARIO_CODINVENTARIO));
	
								Tienda tienda = new Tienda();
								tienda.setCodigo(rs.getInt(INVENTARIO_CODTIENDA));
								tienda.setDescripcion(rs.getString(INVENTARIO_TIENDA));
								inventario.setTienda(tienda);

								reporteInventario.setInventario(inventario);

								return reporteInventario;
							}
						})
				.returningResultSet(LISTADO_LINEAS, new RowMapper<LineaReporteInventario>() {
							@Override
							public LineaReporteInventario mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final LineaReporteInventario lineaReporteInventario = new LineaReporteInventario();

								Producto producto = new Producto();
								producto.setCodigo(rs.getInt(INVENTARIO_CODPRODUCTO));
								producto.setCodProductoProveedor(rs.getString(PRODUCTO_CODPRODUCTOPROVEEDOR));
								producto.setDescripcion(rs.getString(INVENTARIO_DESCRIPCION));
								producto.setPrecioVentaMaximo(rs.getDouble(INVENTARIO_PRECIO));
								
								NivelProducto nivelProducto = new NivelProducto();
								nivelProducto.setDescripcion(rs.getString(PRODUCTO_NIVELPRODUCTO));
								producto.setNivelProducto(nivelProducto);

								NivelTipo nivelTipo = new NivelTipo();
								nivelTipo.setDescripcion(rs.getString(PRODUCTO_NIVELTIPO));
								producto.setNivelTipo(nivelTipo);

								NivelMaterial nivelMaterial = new NivelMaterial();
								nivelMaterial.setDescripcion(rs.getString(PRODUCTO_NIVELMATERIAL));
								producto.setNivelMaterial(nivelMaterial);

								NivelColor nivelColor = new NivelColor();
								nivelColor.setDescripcion(rs.getString(PRODUCTO_NIVELCOLOR));
								producto.setNivelColor(nivelColor);

								lineaReporteInventario.setProducto(producto);

								lineaReporteInventario.setStockInventario(rs.getInt(INVENTARIO_STOCKINVENTARIO));
								lineaReporteInventario.setStockSistema(rs.getInt(INVENTARIO_STOCKSISTEMA));

								return lineaReporteInventario;
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource().addValue(
				PARAM_CODTIENDA, inventario.getTienda().getCodigo()).addValue(
				PARAM_CODINVENTARIO, inventario.getCodInventario());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<ReporteInventario> listaReporteInventario = (List<ReporteInventario>) data
				.get(LISTADO);

		// Declarando objeto reporteInventario Obtenido
		ReporteInventario reporteInventarioObtenido = null;

		if (logger.isDebugEnabled() && listaReporteInventario != null) {
			logger.debug("size=" + listaReporteInventario.size());
		}

		if (listaReporteInventario != null && listaReporteInventario.size() > 0) {
			// Obteniendo el primer elemento de la lista de venta
			reporteInventarioObtenido = listaReporteInventario.get(0);

			// Obteniendo lista de lineas generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<LineaReporteInventario> listaLineaReporteInventario = (List<LineaReporteInventario>) data.get(LISTADO_LINEAS);

			// Instanciando objeto ListaLineaReporteInventario
			ListaLineaReporteInventario listaLineaReporteInventarioResultado = new ListaLineaReporteInventario();
			// Estableciendo resultado al objeto
			// listaLineaReporteInventarioResultado
			listaLineaReporteInventarioResultado.setLista(listaLineaReporteInventario);

			// Asignando lista de lineas al objeto venta creado
			reporteInventarioObtenido.setListaLineaVenta(listaLineaReporteInventarioResultado);

			if (logger.isDebugEnabled() && listaLineaReporteInventarioResultado != null) {
				logger.debug("sizeLineas="+ listaLineaReporteInventarioResultado.size());
			}
		}

		return reporteInventarioObtenido;
	}
	
	@Override
	public ReporteInventario obtenerReporteInventarioSistema(Inventario inventario) {
		logger.info("obtenerReporteInventarioSistema");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_REPORTE_INVENTARIO_SISTEMA)
				.returningResultSet(LISTADO, new RowMapper<ReporteInventario>() {
							@Override
							public ReporteInventario mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final ReporteInventario reporteInventario = new ReporteInventario();

								Inventario inventario = new Inventario();
								inventario.setCodInventario(rs.getInt(INVENTARIO_CODINVENTARIO));
			
								Tienda tienda = new Tienda();
								tienda.setCodigo(rs.getInt(INVENTARIO_CODTIENDA));
								tienda.setDescripcion(rs.getString(INVENTARIO_TIENDA));
								inventario.setTienda(tienda);

								reporteInventario.setInventario(inventario);

								return reporteInventario;
							}
						})
				.returningResultSet(LISTADO_LINEAS, new RowMapper<LineaReporteInventario>() {
							@Override
							public LineaReporteInventario mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final LineaReporteInventario lineaReporteInventario = new LineaReporteInventario();

								Producto producto = new Producto();
								producto.setCodigo(rs.getInt(INVENTARIO_CODPRODUCTO));
								producto.setCodProductoProveedor(rs.getString(PRODUCTO_CODPRODUCTOPROVEEDOR));
								producto.setDescripcion(rs.getString(INVENTARIO_DESCRIPCION));
								producto.setPrecioVentaMaximo(rs.getDouble(INVENTARIO_PRECIO));
								
								NivelProducto nivelProducto = new NivelProducto();
								nivelProducto.setDescripcion(rs.getString(PRODUCTO_NIVELPRODUCTO));
								producto.setNivelProducto(nivelProducto);

								NivelTipo nivelTipo = new NivelTipo();
								nivelTipo.setDescripcion(rs.getString(PRODUCTO_NIVELTIPO));
								producto.setNivelTipo(nivelTipo);

								NivelMaterial nivelMaterial = new NivelMaterial();
								nivelMaterial.setDescripcion(rs.getString(PRODUCTO_NIVELMATERIAL));
								producto.setNivelMaterial(nivelMaterial);

								NivelColor nivelColor = new NivelColor();
								nivelColor.setDescripcion(rs.getString(PRODUCTO_NIVELCOLOR));
								producto.setNivelColor(nivelColor);

								lineaReporteInventario.setProducto(producto);

								lineaReporteInventario.setStockInventario(rs.getInt(INVENTARIO_STOCKINVENTARIO));
								lineaReporteInventario.setStockSistema(rs.getInt(INVENTARIO_STOCKSISTEMA));

								return lineaReporteInventario;
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource()
		                                 .addValue(PARAM_CODTIENDA, inventario.getTienda().getCodigo());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<ReporteInventario> listaReporteInventario = (List<ReporteInventario>) data.get(LISTADO);

		// Declarando objeto reporteInventario Obtenido
		ReporteInventario reporteInventarioObtenido = null;

		if (logger.isDebugEnabled() && listaReporteInventario != null) {
			logger.debug("size=" + listaReporteInventario.size());
		}

		if (listaReporteInventario != null && listaReporteInventario.size() > 0) {
			// Obteniendo el primer elemento de la lista de venta
			reporteInventarioObtenido = listaReporteInventario.get(0);

			// Obteniendo lista de lineas generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<LineaReporteInventario> listaLineaReporteInventario = (List<LineaReporteInventario>) data.get(LISTADO_LINEAS);

			// Instanciando objeto ListaLineaReporteInventario
			ListaLineaReporteInventario listaLineaReporteInventarioResultado = new ListaLineaReporteInventario();
			// Estableciendo resultado al objeto
			// listaLineaReporteInventarioResultado
			listaLineaReporteInventarioResultado.setLista(listaLineaReporteInventario);

			// Asignando lista de lineas al objeto venta creado
			reporteInventarioObtenido.setListaLineaVenta(listaLineaReporteInventarioResultado);

			if (logger.isDebugEnabled() && listaLineaReporteInventarioResultado != null) {
				logger.debug("sizeLineas="+ listaLineaReporteInventarioResultado.size());
			}
		}

		return reporteInventarioObtenido;
	}

	@Override
	public ReporteVenta obtenerReporteVentaxFecha(ReporteSolicitud reporteSolicitud) {
		logger.info("obtenerReporteVentaxFecha");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_REPORTE_VENTAS_X_FECHA)
				.returningResultSet(LISTADO_LINEAS,
						new RowMapper<LineaReporteVenta>() {
							@Override
							public LineaReporteVenta mapRow(final ResultSet rs,final int numRow) throws SQLException {
								final LineaReporteVenta lineaReporteVenta = new LineaReporteVenta();

								Venta venta = new Venta();
								venta.setNumero(rs.getString(VENTA_NUMERO));
								venta.setSerie(rs.getString(VENTA_SERIE));
								venta.setSubTotal(rs.getDouble(VENTA_SUBTOTAL));
								venta.setIgv(rs.getDouble(VENTA_IGV));
								venta.setTotal(rs.getDouble(VENTA_TOTAL));

								Diseniador diseniador = new Diseniador();
								diseniador.setNombresyApellidos(rs.getString(VENTA_NOMDECORADOR));
								venta.setDiseniador(diseniador);

								Cliente cliente = new Cliente();
								cliente.setRazonSocial(rs.getString(VENTA_RAZONSOCIAL));
								venta.setCliente(cliente);

								Usuario usuario = new Usuario();
								usuario.setApellidos(rs.getString(VENTA_APEVENDEDOR));
								usuario.setNombres(rs.getString(VENTA_NOMVENDEDOR));
								venta.setUsuario(usuario);

								TipoDocumentoVenta tipoDocumentoVenta = new TipoDocumentoVenta();
								tipoDocumentoVenta.setDescripcion(rs.getString(VENTA_TIPO_DOCUMENTO));
								venta.setTipoDocumentoVenta(tipoDocumentoVenta);

								Tienda tienda = new Tienda();
								tienda.setCodigo(rs.getInt(VENTA_CODTIENDA));
								tienda.setDescripcion(rs.getString(VENTA_NOMTIENDA));
								venta.setTienda(tienda);

								lineaReporteVenta.setDescripcionEstado(rs.getString(VENTA_ENTREGADO));
								lineaReporteVenta.setVenta(venta);

								return lineaReporteVenta;
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource()
		                   .addValue(PARAM_FECHAINICIO, reporteSolicitud.getFechaInicio())
		                   .addValue(PARAM_FECHAFIN, reporteSolicitud.getFechaFin());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Obteniendo lista generada de ejecutar SP

		// Declarando objeto reporteVentaObtenido
		ReporteVenta reporteVentaObtenido = new ReporteVenta();

		// Obteniendo lista de lineas generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<LineaReporteVenta> listaLineaReporteVenta = (List<LineaReporteVenta>) data.get(LISTADO_LINEAS);

		// Instanciando objeto ListaLineaReporteVenta
		ListaLineaReporteVenta listaLineaReporteVentaResultado = new ListaLineaReporteVenta();
		// Estableciendo resultado al objeto listaLineaReporteVentaResultado
		listaLineaReporteVentaResultado.setLista(listaLineaReporteVenta);

		// Asignando lista de lineas al objeto venta creado
		reporteVentaObtenido.setListaLineaVenta(listaLineaReporteVentaResultado);

		if (logger.isDebugEnabled() && listaLineaReporteVentaResultado != null) {
			logger.debug("sizeLineas=" + listaLineaReporteVentaResultado.size());
		}

		return reporteVentaObtenido;
	}

	@Override
	public ReporteVenta obtenerReporteVentaxProducto(
			ReporteSolicitud reporteSolicitud) {
		logger.info("obtenerReporteVentaxProducto");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_REPORTE_VENTAS_X_PRODUCTO)
				.returningResultSet(LISTADO_LINEAS,	new RowMapper<LineaReporteVenta>() {
							@Override
							public LineaReporteVenta mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final LineaReporteVenta lineaReporteVenta = new LineaReporteVenta();

								Venta venta = new Venta();
								venta.setNumero(rs.getString(VENTA_NUMERO));
								venta.setSerie(rs.getString(VENTA_SERIE));
								venta.setSubTotal(rs.getDouble(VENTA_SUBTOTAL));
								venta.setIgv(rs.getDouble(VENTA_IGV));
								venta.setTotal(rs.getDouble(VENTA_TOTAL));

								Diseniador diseniador = new Diseniador();
								diseniador.setNombresyApellidos(rs.getString(VENTA_NOMDECORADOR));
								venta.setDiseniador(diseniador);

								Cliente cliente = new Cliente();
								cliente.setRazonSocial(rs.getString(VENTA_RAZONSOCIAL));
								venta.setCliente(cliente);

								Usuario usuario = new Usuario();
								usuario.setApellidos(rs.getString(VENTA_APEVENDEDOR));
								usuario.setNombres(rs.getString(VENTA_NOMVENDEDOR));
								venta.setUsuario(usuario);

								TipoDocumentoVenta tipoDocumentoVenta = new TipoDocumentoVenta();
								tipoDocumentoVenta.setDescripcion(rs.getString(VENTA_TIPO_DOCUMENTO));
								venta.setTipoDocumentoVenta(tipoDocumentoVenta);

								Tienda tienda = new Tienda();
								tienda.setCodigo(rs.getInt(VENTA_CODTIENDA));
								tienda.setDescripcion(rs.getString(VENTA_NOMTIENDA));
								venta.setTienda(tienda);

								lineaReporteVenta.setDescripcionEstado(rs.getString(VENTA_ENTREGADO));
								lineaReporteVenta.setVenta(venta);

								return lineaReporteVenta;
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource()
				.addValue(PARAM_FECHAINICIO, reporteSolicitud.getFechaInicio())
				.addValue(PARAM_FECHAFIN, reporteSolicitud.getFechaFin())
				.addValue(PARAM_CODPRODUCTO,reporteSolicitud.getProducto().getCodigo());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Obteniendo lista generada de ejecutar SP

		// Declarando objeto reporteVentaObtenido
		ReporteVenta reporteVentaObtenido = new ReporteVenta();

		// Obteniendo lista de lineas generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<LineaReporteVenta> listaLineaReporteVenta = (List<LineaReporteVenta>) data.get(LISTADO_LINEAS);

		// Instanciando objeto ListaLineaReporteVenta
		ListaLineaReporteVenta listaLineaReporteVentaResultado = new ListaLineaReporteVenta();
		// Estableciendo resultado al objeto listaLineaReporteVentaResultado
		listaLineaReporteVentaResultado.setLista(listaLineaReporteVenta);

		// Asignando lista de lineas al objeto venta creado
		reporteVentaObtenido.setListaLineaVenta(listaLineaReporteVentaResultado);

		if (logger.isDebugEnabled() && listaLineaReporteVentaResultado != null) {
			logger.debug("sizeLineas=" + listaLineaReporteVentaResultado.size());
		}

		return reporteVentaObtenido;
	}

	@Override
	public ReporteVenta obtenerReporteVentaxCliente(
			ReporteSolicitud reporteSolicitud) {
		logger.info("obtenerReporteVentaxCliente");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_REPORTE_VENTAS_X_CLIENTE)
				.returningResultSet(LISTADO_LINEAS,
						new RowMapper<LineaReporteVenta>() {
							@Override
							public LineaReporteVenta mapRow(final ResultSet rs,
									final int numRow) throws SQLException {
								final LineaReporteVenta lineaReporteVenta = new LineaReporteVenta();

								Venta venta = new Venta();
								venta.setNumero(rs.getString(VENTA_NUMERO));
								venta.setSerie(rs.getString(VENTA_SERIE));
								venta.setSubTotal(rs.getDouble(VENTA_SUBTOTAL));
								venta.setIgv(rs.getDouble(VENTA_IGV));
								venta.setTotal(rs.getDouble(VENTA_TOTAL));

								Diseniador diseniador = new Diseniador();
								diseniador.setNombresyApellidos(rs
										.getString(VENTA_NOMDECORADOR));
								venta.setDiseniador(diseniador);

								Cliente cliente = new Cliente();
								cliente.setRazonSocial(rs
										.getString(VENTA_RAZONSOCIAL));
								venta.setCliente(cliente);

								Usuario usuario = new Usuario();
								usuario.setApellidos(rs
										.getString(VENTA_APEVENDEDOR));
								usuario.setNombres(rs
										.getString(VENTA_NOMVENDEDOR));
								venta.setUsuario(usuario);

								TipoDocumentoVenta tipoDocumentoVenta = new TipoDocumentoVenta();
								tipoDocumentoVenta.setDescripcion(rs
										.getString(VENTA_TIPO_DOCUMENTO));
								venta.setTipoDocumentoVenta(tipoDocumentoVenta);

								Tienda tienda = new Tienda();
								tienda.setCodigo(rs.getInt(VENTA_CODTIENDA));
								tienda.setDescripcion(rs
										.getString(VENTA_NOMTIENDA));
								venta.setTienda(tienda);

								lineaReporteVenta.setDescripcionEstado(rs
										.getString(VENTA_ENTREGADO));
								lineaReporteVenta.setVenta(venta);

								return lineaReporteVenta;
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource()
				.addValue(PARAM_FECHAINICIO, reporteSolicitud.getFechaInicio())
				.addValue(PARAM_FECHAFIN, reporteSolicitud.getFechaFin())
				.addValue(PARAM_CODCLIENTE,
						reporteSolicitud.getCliente().getCodCliente());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Obteniendo lista generada de ejecutar SP

		// Declarando objeto reporteVentaObtenido
		ReporteVenta reporteVentaObtenido = new ReporteVenta();

		// Obteniendo lista de lineas generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<LineaReporteVenta> listaLineaReporteVenta = (List<LineaReporteVenta>) data
				.get(LISTADO_LINEAS);

		// Instanciando objeto ListaLineaReporteVenta
		ListaLineaReporteVenta listaLineaReporteVentaResultado = new ListaLineaReporteVenta();
		// Estableciendo resultado al objeto listaLineaReporteVentaResultado
		listaLineaReporteVentaResultado.setLista(listaLineaReporteVenta);

		// Asignando lista de lineas al objeto venta creado
		reporteVentaObtenido
				.setListaLineaVenta(listaLineaReporteVentaResultado);

		if (logger.isDebugEnabled() && listaLineaReporteVentaResultado != null) {
			logger.debug("sizeLineas=" + listaLineaReporteVentaResultado.size());
		}

		return reporteVentaObtenido;
	}

	@Override
	public ReporteVenta obtenerReporteVentaxDecorador(
			ReporteSolicitud reporteSolicitud) {
		logger.info("obtenerReporteVentaxDecorador");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_REPORTE_VENTAS_X_DECORADOR)
				.returningResultSet(LISTADO_LINEAS,
						new RowMapper<LineaReporteVenta>() {
							@Override
							public LineaReporteVenta mapRow(final ResultSet rs,
									final int numRow) throws SQLException {
								final LineaReporteVenta lineaReporteVenta = new LineaReporteVenta();

								Venta venta = new Venta();
								venta.setNumero(rs.getString(VENTA_NUMERO));
								venta.setSerie(rs.getString(VENTA_SERIE));
								venta.setSubTotal(rs.getDouble(VENTA_SUBTOTAL));
								venta.setIgv(rs.getDouble(VENTA_IGV));
								venta.setTotal(rs.getDouble(VENTA_TOTAL));

								Diseniador diseniador = new Diseniador();
								diseniador.setNombresyApellidos(rs
										.getString(VENTA_NOMDECORADOR));
								venta.setDiseniador(diseniador);

								Cliente cliente = new Cliente();
								cliente.setRazonSocial(rs
										.getString(VENTA_RAZONSOCIAL));
								venta.setCliente(cliente);

								Usuario usuario = new Usuario();
								usuario.setApellidos(rs
										.getString(VENTA_APEVENDEDOR));
								usuario.setNombres(rs
										.getString(VENTA_NOMVENDEDOR));
								venta.setUsuario(usuario);

								TipoDocumentoVenta tipoDocumentoVenta = new TipoDocumentoVenta();
								tipoDocumentoVenta.setDescripcion(rs
										.getString(VENTA_TIPO_DOCUMENTO));
								venta.setTipoDocumentoVenta(tipoDocumentoVenta);

								Tienda tienda = new Tienda();
								tienda.setCodigo(rs.getInt(VENTA_CODTIENDA));
								tienda.setDescripcion(rs
										.getString(VENTA_NOMTIENDA));
								venta.setTienda(tienda);

								lineaReporteVenta.setDescripcionEstado(rs
										.getString(VENTA_ENTREGADO));
								lineaReporteVenta.setVenta(venta);

								return lineaReporteVenta;
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource()
				.addValue(PARAM_FECHAINICIO, reporteSolicitud.getFechaInicio())
				.addValue(PARAM_FECHAFIN, reporteSolicitud.getFechaFin())
				.addValue(PARAM_CODDISENIADOR,
						reporteSolicitud.getDiseniador().getCodDiseniador());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Obteniendo lista generada de ejecutar SP

		// Declarando objeto reporteVentaObtenido
		ReporteVenta reporteVentaObtenido = new ReporteVenta();

		// Obteniendo lista de lineas generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<LineaReporteVenta> listaLineaReporteVenta = (List<LineaReporteVenta>) data
				.get(LISTADO_LINEAS);

		// Instanciando objeto ListaLineaReporteVenta
		ListaLineaReporteVenta listaLineaReporteVentaResultado = new ListaLineaReporteVenta();
		// Estableciendo resultado al objeto listaLineaReporteVentaResultado
		listaLineaReporteVentaResultado.setLista(listaLineaReporteVenta);

		// Asignando lista de lineas al objeto venta creado
		reporteVentaObtenido
				.setListaLineaVenta(listaLineaReporteVentaResultado);

		if (logger.isDebugEnabled() && listaLineaReporteVentaResultado != null) {
			logger.debug("sizeLineas=" + listaLineaReporteVentaResultado.size());
		}

		return reporteVentaObtenido;
	}

	@Override
	public ReporteProducto obtenerReporteProductoxOrigen(
			ReporteSolicitud reporteSolicitud) {
		logger.info("obtenerReporteProductoxOrigen");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_REPORTE_PRODUCTO_X_ORIGEN)
				.returningResultSet(LISTADO_LINEAS,
						new RowMapper<LineaReporteProducto>() {
							@Override
							public LineaReporteProducto mapRow(
									final ResultSet rs, final int numRow)
									throws SQLException {
								final LineaReporteProducto lineaReporteProducto = new LineaReporteProducto();

								Producto producto = new Producto();

								producto.setCodigo(rs
										.getInt(PRODUCTO_CODPRODUCTO));
								producto.setDescripcion(rs
										.getString(PRODUCTO_DESCRIPCION));
								producto.setPrecioVentaMinimo(rs
										.getDouble(PRODUCTO_PRECIOVENTAMINIMO));
								producto.setPrecioVentaMaximo(rs
										.getDouble(PRODUCTO_PRECIOVENTAMAXIMO));
								producto.setAlto(rs.getDouble(PRODUCTO_ALTO));
								producto.setAncho(rs.getDouble(PRODUCTO_ANCHO));
								producto.setLargo(rs.getDouble(PRODUCTO_LARGO));
								producto.setCodProductoProveedor(rs
										.getString(PRODUCTO_CODPRODUCTOPROVEEDOR));
								producto.setComponentes(rs
										.getString(PRODUCTO_COMPONENTES));
								producto.setEstado(rs
										.getString(PRODUCTO_ESTADO));

								NivelProducto nivelProducto = new NivelProducto();
								nivelProducto.setDescripcion(rs
										.getString(PRODUCTO_NIVELPRODUCTO));
								producto.setNivelProducto(nivelProducto);

								NivelTipo nivelTipo = new NivelTipo();
								nivelTipo.setDescripcion(rs
										.getString(PRODUCTO_NIVELTIPO));
								producto.setNivelTipo(nivelTipo);

								NivelMaterial nivelMaterial = new NivelMaterial();
								nivelMaterial.setDescripcion(rs
										.getString(PRODUCTO_NIVELMATERIAL));
								producto.setNivelMaterial(nivelMaterial);

								NivelColor nivelColor = new NivelColor();
								nivelColor.setDescripcion(rs
										.getString(PRODUCTO_NIVELCOLOR));
								producto.setNivelColor(nivelColor);

								Proveedor proveedor = new Proveedor();
								proveedor.setRazonSocial(rs
										.getString(PRODUCTO_RAZONSOCIAL));
								producto.setProveedor(proveedor);

								Pais pais = new Pais();
								pais.setdesPais(rs.getString(PRODUCTO_PAIS));

								lineaReporteProducto.setPais(pais);
								lineaReporteProducto.setProducto(producto);

								return lineaReporteProducto;
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource().addValue(
				PARAM_TIPOORIGEN, reporteSolicitud.getProveedor().getTipo());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Obteniendo lista generada de ejecutar SP

		// Declarando objeto reporteProductoObtenido
		ReporteProducto reporteProductoObtenido = new ReporteProducto();

		// Obteniendo lista de lineas generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<LineaReporteProducto> listaLineaReporteProducto = (List<LineaReporteProducto>) data
				.get(LISTADO_LINEAS);

		// Instanciando objeto ListaLineaReporteProducto
		ListaLineaReporteProducto listaLineaReporteProductoResultado = new ListaLineaReporteProducto();
		// Estableciendo resultado al objeto listaLineaReporteProductoResultado
		listaLineaReporteProductoResultado.setLista(listaLineaReporteProducto);

		// Asignando lista de lineas al objeto Producto creado
		reporteProductoObtenido
				.setListaLineaProducto(listaLineaReporteProductoResultado);

		if (logger.isDebugEnabled()
				&& listaLineaReporteProductoResultado != null) {
			logger.debug("sizeLineas="
					+ listaLineaReporteProductoResultado.size());
		}

		return reporteProductoObtenido;
	}

	@Override
	public ReporteProducto obtenerReporteProductoxProveedor(
			ReporteSolicitud reporteSolicitud) {
		logger.info("obtenerReporteProductoxProveedor");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_REPORTE_PRODUCTO_X_PROVEEDOR)
				.returningResultSet(LISTADO_LINEAS,
						new RowMapper<LineaReporteProducto>() {
							@Override
							public LineaReporteProducto mapRow(
									final ResultSet rs, final int numRow)
									throws SQLException {
								final LineaReporteProducto lineaReporteProducto = new LineaReporteProducto();

								Producto producto = new Producto();

								producto.setCodigo(rs
										.getInt(PRODUCTO_CODPRODUCTO));
								producto.setDescripcion(rs
										.getString(PRODUCTO_DESCRIPCION));
								producto.setPrecioVentaMinimo(rs
										.getDouble(PRODUCTO_PRECIOVENTAMINIMO));
								producto.setPrecioVentaMaximo(rs
										.getDouble(PRODUCTO_PRECIOVENTAMAXIMO));
								producto.setAlto(rs.getDouble(PRODUCTO_ALTO));
								producto.setAncho(rs.getDouble(PRODUCTO_ANCHO));
								producto.setLargo(rs.getDouble(PRODUCTO_LARGO));
								producto.setCodProductoProveedor(rs
										.getString(PRODUCTO_CODPRODUCTOPROVEEDOR));
								producto.setComponentes(rs
										.getString(PRODUCTO_COMPONENTES));
								producto.setEstado(rs
										.getString(PRODUCTO_ESTADO));

								NivelProducto nivelProducto = new NivelProducto();
								nivelProducto.setDescripcion(rs
										.getString(PRODUCTO_NIVELPRODUCTO));
								producto.setNivelProducto(nivelProducto);

								NivelTipo nivelTipo = new NivelTipo();
								nivelTipo.setDescripcion(rs
										.getString(PRODUCTO_NIVELTIPO));
								producto.setNivelTipo(nivelTipo);

								NivelMaterial nivelMaterial = new NivelMaterial();
								nivelMaterial.setDescripcion(rs
										.getString(PRODUCTO_NIVELMATERIAL));
								producto.setNivelMaterial(nivelMaterial);

								NivelColor nivelColor = new NivelColor();
								nivelColor.setDescripcion(rs
										.getString(PRODUCTO_NIVELCOLOR));
								producto.setNivelColor(nivelColor);

								Proveedor proveedor = new Proveedor();
								proveedor.setRazonSocial(rs
										.getString(PRODUCTO_RAZONSOCIAL));
								producto.setProveedor(proveedor);

								Pais pais = new Pais();
								pais.setdesPais(rs.getString(PRODUCTO_PAIS));

								lineaReporteProducto.setPais(pais);
								lineaReporteProducto.setProducto(producto);

								return lineaReporteProducto;
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource().addValue(
				PARAM_CODPROVEEDOR, reporteSolicitud.getProveedor()
						.getCodProveedor());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Obteniendo lista generada de ejecutar SP

		// Declarando objeto reporteProductoObtenido
		ReporteProducto reporteProductoObtenido = new ReporteProducto();

		// Obteniendo lista de lineas generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<LineaReporteProducto> listaLineaReporteProducto = (List<LineaReporteProducto>) data
				.get(LISTADO_LINEAS);

		// Instanciando objeto ListaLineaReporteProducto
		ListaLineaReporteProducto listaLineaReporteProductoResultado = new ListaLineaReporteProducto();
		// Estableciendo resultado al objeto listaLineaReporteProductoResultado
		listaLineaReporteProductoResultado.setLista(listaLineaReporteProducto);

		// Asignando lista de lineas al objeto Producto creado
		reporteProductoObtenido
				.setListaLineaProducto(listaLineaReporteProductoResultado);

		if (logger.isDebugEnabled()
				&& listaLineaReporteProductoResultado != null) {
			logger.debug("sizeLineas="
					+ listaLineaReporteProductoResultado.size());
		}

		return reporteProductoObtenido;
	}

	@Override
	public ReporteGuiaCabecera obtenerReporteDespachosxTienda(
			ReporteSolicitud reporteSolicitud) {
		logger.info("obtenerReporteDespachosxTienda");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_REPORTE_DESPACHOS_X_TIENDA)
				.returningResultSet(LISTADO_LINEAS,
						new RowMapper<LineaReporteGuiaCabecera>() {
							@Override
							public LineaReporteGuiaCabecera mapRow(
									final ResultSet rs, final int numRow)
									throws SQLException {
								final LineaReporteGuiaCabecera lineaReporteGuiaCabecera = new LineaReporteGuiaCabecera();

								Guia guia = new Guia();
								guia.setSerie(rs.getString(GUIA_SERIE));
								guia.setNumero(rs.getString(GUIA_NUMERO));
								guia.setFechaEmision(rs.getString(GUIA_FECHAEMISION));

								Tienda tienda = new Tienda();
								tienda.setCodigo(rs.getInt(GUIA_CODTIENDAORIGEN));
								tienda.setDescripcion(rs.getString(GUIA_TIENDAORIGEN));
								guia.setTiendaOrigen(tienda);

								lineaReporteGuiaCabecera.setDestino(rs
										.getString(GUIA_DESTINO));
								lineaReporteGuiaCabecera.setDespachado(rs
										.getString(GUIA_DESPACHADO));
								lineaReporteGuiaCabecera.setMovilidadPropia(rs
										.getString(GUIA_MOVILIDADPROPIA));
								lineaReporteGuiaCabecera.setDocumentoVenta(rs
										.getString(GUIA_DOCUMENTOVENTA));
								lineaReporteGuiaCabecera.setCodTienda(guia
										.getTiendaOrigen().getCodigo());
								lineaReporteGuiaCabecera.setGuia(guia);

								return lineaReporteGuiaCabecera;
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource().addValue(
				PARAM_FECHAINICIO, reporteSolicitud.getFechaInicio()).addValue(
				PARAM_FECHAFIN, reporteSolicitud.getFechaFin());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Obteniendo lista generada de ejecutar SP

		// Declarando objeto reporteGuiaCabeceraObtenido
		ReporteGuiaCabecera reporteGuiaCabeceraObtenido = new ReporteGuiaCabecera();

		// Obteniendo lista de lineas generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<LineaReporteGuiaCabecera> listaLineaReporteGuiaCabecera = (List<LineaReporteGuiaCabecera>) data
				.get(LISTADO_LINEAS);

		// Instanciando objeto ListaLineaReporteGuiaCabecera
		ListaLineaReporteGuiaCabecera listaLineaReporteGuiaCabeceraResultado = new ListaLineaReporteGuiaCabecera();
		// Estableciendo resultado al objeto
		// listaLineaReporteGuiaCabeceraResultado
		listaLineaReporteGuiaCabeceraResultado
				.setLista(listaLineaReporteGuiaCabecera);

		// Asignando lista de lineas al objeto GuiaCabecera creado
		reporteGuiaCabeceraObtenido
				.setListaLineaGuiaCabecera(listaLineaReporteGuiaCabeceraResultado);

		if (logger.isDebugEnabled()
				&& listaLineaReporteGuiaCabeceraResultado != null) {
			logger.debug("sizeLineas="
					+ listaLineaReporteGuiaCabeceraResultado.size());
		}

		return reporteGuiaCabeceraObtenido;
	}

	@Override
	public ReporteGuia obtenerReporteContenidoGuia(	ReporteSolicitud reporteSolicitud) {
		logger.info("obtenerReporteContenidoGuia");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_REPORTE_CONTENIDO_GUIA)
				.returningResultSet(LISTADO, new RowMapper<ReporteGuia>() {
					@Override
					public ReporteGuia mapRow(final ResultSet rs, final int numRow) throws SQLException {
						final ReporteGuia reporteGuia = new ReporteGuia();

						Guia guia = new Guia();
						guia.setSerie(rs.getString(GUIA_SERIE));
						guia.setNumero(rs.getString(GUIA_NUMERO));
						guia.setFechaEmision(rs.getString(GUIA_FECHAEMISION));

						Tienda tienda = new Tienda();
						tienda.setCodigo(rs.getInt(GUIA_CODTIENDAORIGEN));
						tienda.setDescripcion(rs.getString(GUIA_TIENDAORIGEN));
						guia.setTiendaOrigen(tienda);

						reporteGuia.setDestino(rs.getString(GUIA_DESTINO));
						reporteGuia.setDespachado(rs.getString(GUIA_DESPACHADO));
						reporteGuia.setMovilidadPropia(rs.getString(GUIA_MOVILIDADPROPIA));
						reporteGuia.setDocumentoVenta(rs.getString(GUIA_DOCUMENTOVENTA));
						reporteGuia.setCodTienda(guia.getTiendaOrigen().getCodigo());
						reporteGuia.setGuia(guia);

						return reporteGuia;
					}
				})
				.returningResultSet(LISTADO_LINEAS,
						new RowMapper<LineaReporteGuia>() {
							@Override
							public LineaReporteGuia mapRow(final ResultSet rs,
									final int numRow) throws SQLException {
								final LineaReporteGuia lineaReporteGuia = new LineaReporteGuia();

								LineaGuia lineaGuia = new LineaGuia();
								lineaGuia.setCantidad(rs.getInt(GUIA_CANTIDAD));

								Producto producto = new Producto();
								producto.setCodigo(rs.getInt(GUIA_CODPRODUCTO));
								producto.setDescripcion(rs.getString(GUIA_DESCRIPCION));
								producto.setCodProductoProveedor(rs.getString(GUIA_CODPRODUCTOPROVEEDOR));
								lineaGuia.setProducto(producto);

								lineaReporteGuia.setLineaGuia(lineaGuia);

								return lineaReporteGuia;
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource().addValue(
				PARAM_SERIE, reporteSolicitud.getGuia().getSerie()).addValue(
				PARAM_NUMERO, reporteSolicitud.getGuia().getNumero());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<ReporteGuia> listaReporteGuia = (List<ReporteGuia>) data
				.get(LISTADO);

		// Declarando objeto reporteGuia Obtenido
		ReporteGuia reporteGuiaObtenido = null;

		if (logger.isDebugEnabled() && listaReporteGuia != null) {
			logger.debug("size=" + listaReporteGuia.size());
		}

		if (listaReporteGuia != null && listaReporteGuia.size() > 0) {
			// Obteniendo el primer elemento de la lista de venta
			reporteGuiaObtenido = listaReporteGuia.get(0);

			// Obteniendo lista de lineas generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<LineaReporteGuia> listaLineaReporteGuia = (List<LineaReporteGuia>) data.get(LISTADO_LINEAS);

			// Instanciando objeto ListaLineaReporteGuia
			ListaLineaReporteGuia listaLineaReporteGuiaResultado = new ListaLineaReporteGuia();
			// Estableciendo resultado al objeto listaLineaReporteGuiaResultado
			listaLineaReporteGuiaResultado.setLista(listaLineaReporteGuia);

			// Asignando lista de lineas al objeto venta creado
			reporteGuiaObtenido.setListaLineaGuia(listaLineaReporteGuiaResultado);

			if (logger.isDebugEnabled() && listaLineaReporteGuiaResultado != null) {
				logger.debug("sizeLineas=" + listaLineaReporteGuiaResultado.size());
			}
		}

		return reporteGuiaObtenido;
	}
	
	@Override
	public ReporteGuiaCabecera obtenerReportePrestamosxTienda(ReporteSolicitud reporteSolicitud){
		logger.info("obtenerReportePrestamosxTienda");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_REPORTE_PRESTAMOS_X_TIENDA)
				.returningResultSet(LISTADO_LINEAS, new RowMapper<LineaReporteGuiaCabecera>() {
							@Override
							public LineaReporteGuiaCabecera mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final LineaReporteGuiaCabecera lineaReporteGuiaCabecera = new LineaReporteGuiaCabecera();

								Guia guia = new Guia();
								guia.setSerie(rs.getString(GUIA_SERIE));
								guia.setNumero(rs.getString(GUIA_NUMERO));
								guia.setFechaEmision(rs.getString(GUIA_FECHAFIN));

								Tienda tienda = new Tienda();
								tienda.setCodigo(rs.getInt(GUIA_CODTIENDAORIGEN));
								tienda.setDescripcion(rs.getString(GUIA_TIENDAORIGEN));
								guia.setTiendaOrigen(tienda);

								lineaReporteGuiaCabecera.setDestino(rs.getString(GUIA_DESTINO));
								lineaReporteGuiaCabecera.setDespachado(rs.getString(GUIA_DESPACHADO));
								lineaReporteGuiaCabecera.setMovilidadPropia(rs.getString(GUIA_MOVILIDADPROPIA));
								lineaReporteGuiaCabecera.setDocumentoVenta(rs.getString(GUIA_DOCUMENTOVENTA));
								lineaReporteGuiaCabecera.setCodTienda(guia.getTiendaOrigen().getCodigo());
								lineaReporteGuiaCabecera.setGuia(guia);

								return lineaReporteGuiaCabecera;
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource()
		              .addValue(PARAM_FECHAINICIO, reporteSolicitud.getFechaInicio())
					  .addValue(PARAM_FECHAFIN, reporteSolicitud.getFechaFin());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Obteniendo lista generada de ejecutar SP

		// Declarando objeto reporteGuiaCabeceraObtenido
		ReporteGuiaCabecera reporteGuiaCabeceraObtenido = new ReporteGuiaCabecera();

		// Obteniendo lista de lineas generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<LineaReporteGuiaCabecera> listaLineaReporteGuiaCabecera = (List<LineaReporteGuiaCabecera>) data
				.get(LISTADO_LINEAS);

		// Instanciando objeto ListaLineaReporteGuiaCabecera
		ListaLineaReporteGuiaCabecera listaLineaReporteGuiaCabeceraResultado = new ListaLineaReporteGuiaCabecera();
		// Estableciendo resultado al objeto
		// listaLineaReporteGuiaCabeceraResultado
		listaLineaReporteGuiaCabeceraResultado
				.setLista(listaLineaReporteGuiaCabecera);

		// Asignando lista de lineas al objeto GuiaCabecera creado
		reporteGuiaCabeceraObtenido
				.setListaLineaGuiaCabecera(listaLineaReporteGuiaCabeceraResultado);

		if (logger.isDebugEnabled()
				&& listaLineaReporteGuiaCabeceraResultado != null) {
			logger.debug("sizeLineas="
					+ listaLineaReporteGuiaCabeceraResultado.size());
		}

		return reporteGuiaCabeceraObtenido;
	}
	
	@Override
	public ReporteProveedor obtenerReporteProveedorxPais(ReporteSolicitud reporteSolicitud){
		logger.info("obtenerReporteProveedorxPais");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_REPORTE_PROVEEDOR_X_PAIS)
				.returningResultSet(LISTADO_LINEAS, new RowMapper<LineaReporteProveedor>() {
							@Override
							public LineaReporteProveedor mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final LineaReporteProveedor lineaReporteProveedor = new LineaReporteProveedor();

								Proveedor proveedor = new Proveedor();
								proveedor.setCodProveedor(rs.getInt(PROVEEDOR_CODPROVEEDOR));
								proveedor.setRazonSocial(rs.getString(PROVEEDOR_RAZONSOCIAL));
								proveedor.setObservacion(rs.getString(PROVEEDOR_OBSERVACION));
								proveedor.setDireccion(rs.getString(PROVEEDOR_DIRECCION));

								lineaReporteProveedor.setProveedor(proveedor);

								return lineaReporteProveedor;
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource()
		              .addValue(PARAM_CODPAIS, reporteSolicitud.getPais().getcodPais())
					  .addValue(PARAM_CODNIVELTIPO, reporteSolicitud.getNivelTipo().getCodigo())
					  .addValue(PARAM_CODNIVELPROD, reporteSolicitud.getNivelTipo().getCodNivelProducto());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Obteniendo lista generada de ejecutar SP

		// Declarando objeto reporteProveedorObtenido
		ReporteProveedor reporteProveedorObtenido = new ReporteProveedor();

		// Obteniendo lista de lineas generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<LineaReporteProveedor> listaLineaReporteProveedor = (List<LineaReporteProveedor>) data.get(LISTADO_LINEAS);

		// Instanciando objeto ListaLineaReporteProveedor
		ListaLineaReporteProveedor listaLineaReporteProveedorResultado = new ListaLineaReporteProveedor();
		// Estableciendo resultado al objeto listaLineaReporteProveedorResultado
		listaLineaReporteProveedorResultado.setLista(listaLineaReporteProveedor);

		// Asignando lista de lineas al objeto Proveedor creado
		reporteProveedorObtenido.setListaLineaProveedor(listaLineaReporteProveedorResultado);

		if (logger.isDebugEnabled() && listaLineaReporteProveedorResultado != null) {
			logger.debug("sizeLineas="+ listaLineaReporteProveedorResultado.size());
		}

		return reporteProveedorObtenido;
	}	
	
	@Override
	public ReporteVentaDetalle obtenerReporteContenidoFactura(ReporteSolicitud reporteSolicitud) {
		logger.info("obtenerReporteContenidoFactura");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_REPORTE_CONTENIDO_FACTURA)
				.returningResultSet(LISTADO, new RowMapper<ReporteVentaDetalle>() {
					@Override
					public ReporteVentaDetalle mapRow(final ResultSet rs, final int numRow) throws SQLException {
						final ReporteVentaDetalle reporteVentaDetalle = new ReporteVentaDetalle();
						
						Venta venta = new Venta();
						venta.setNumero(rs.getString(VENTA_NUMERO));
						venta.setSerie(rs.getString(VENTA_SERIE));
						venta.setSubTotal(rs.getDouble(VENTA_SUBTOTAL));
						venta.setIgv(rs.getDouble(VENTA_IGV));
						venta.setTotal(rs.getDouble(VENTA_TOTAL));

						Diseniador diseniador = new Diseniador();
						diseniador.setNombresyApellidos(rs.getString(VENTA_NOMDECORADOR));
						venta.setDiseniador(diseniador);

						Cliente cliente = new Cliente();
						cliente.setRazonSocial(rs.getString(VENTA_RAZONSOCIAL));
						venta.setCliente(cliente);

						Usuario usuario = new Usuario();
						usuario.setApellidos(rs.getString(VENTA_APEVENDEDOR));
						usuario.setNombres(rs.getString(VENTA_NOMVENDEDOR));
						venta.setUsuario(usuario);

						TipoDocumentoVenta tipoDocumentoVenta = new TipoDocumentoVenta();
						tipoDocumentoVenta.setDescripcion(rs.getString(VENTA_TIPO_DOCUMENTO));
						venta.setTipoDocumentoVenta(tipoDocumentoVenta);

						Tienda tienda = new Tienda();
						tienda.setCodigo(rs.getInt(VENTA_CODTIENDA));
						tienda.setDescripcion(rs.getString(VENTA_NOMTIENDA));
						venta.setTienda(tienda);

						reporteVentaDetalle.setDescripcionEstado(rs.getString(VENTA_ENTREGADO));
						reporteVentaDetalle.setVenta(venta);
						
						return reporteVentaDetalle;
					}
				})
				.returningResultSet(LISTADO_LINEAS,	new RowMapper<LineaReporteVentaDetalle>() {
							@Override
							public LineaReporteVentaDetalle mapRow(final ResultSet rs,final int numRow) throws SQLException {
								final LineaReporteVentaDetalle lineaReporteVentaDetalle = new LineaReporteVentaDetalle();

								LineaVenta lineaVenta = new LineaVenta();
								Producto producto = new Producto();
								producto.setCodigo(rs.getInt(VENTA_CODPRODUCTO));
								producto.setCodProductoProveedor(rs.getString(VENTA_CODPRODUCTOPROVEEDOR));
								producto.setDescripcion(rs.getString(VENTA_DESCRIPCION));
								lineaVenta.setProducto(producto);
								
								lineaVenta.setCantidad(rs.getInt(VENTA_CANTIDAD));
								lineaVenta.setPrecio(rs.getDouble(VENTA_PRECIO));
								
								lineaReporteVentaDetalle.setLineaVenta(lineaVenta);
								
								return lineaReporteVentaDetalle;
							}
				});
               // Estableciendo parametros de entrada al SP
               SqlParameterSource parametros = new MapSqlParameterSource()
                                  .addValue(PARAM_SERIE, reporteSolicitud.getVenta().getSerie())
                                  .addValue(PARAM_NUMERO, reporteSolicitud.getVenta().getNumero())
                                  .addValue(PARAM_CODTIPODOCUMENTOVENTA, reporteSolicitud.getVenta().getTipoDocumentoVenta().getCodigo());
               
       		// Establecer parametros y ejecutar SP
       		Map<String, Object> data = llamarSP.execute(parametros);

       		// Obteniendo lista generada de ejecutar SP
       		@SuppressWarnings("unchecked")
       		List<ReporteVentaDetalle> listaReporteVentaDetalle = (List<ReporteVentaDetalle>) data.get(LISTADO);

       		// Declarando objeto reporteVentaDetalle Obtenido
       		ReporteVentaDetalle reporteVentaDetalleObtenido = null;

       		if (logger.isDebugEnabled() && listaReporteVentaDetalle != null) {
       			logger.debug("size=" + listaReporteVentaDetalle.size());
       		}

       		if (listaReporteVentaDetalle != null && listaReporteVentaDetalle.size() > 0) {
       			// Obteniendo el primer elemento de la lista de venta
       			reporteVentaDetalleObtenido = listaReporteVentaDetalle.get(0);

       			// Obteniendo lista de lineas generada de ejecutar SP
       			@SuppressWarnings("unchecked")
       			List<LineaReporteVentaDetalle> listaLineaReporteVentaDetalle = (List<LineaReporteVentaDetalle>) data.get(LISTADO_LINEAS);

       			// Instanciando objeto ListaLineaReporteVentaDetalle
       			ListaLineaReporteVentaDetalle listaLineaReporteVentaDetalleResultado = new ListaLineaReporteVentaDetalle();
       			// Estableciendo resultado al objeto listaLineaReporteVentaDetalleResultado
       			listaLineaReporteVentaDetalleResultado.setLista(listaLineaReporteVentaDetalle);

       			// Asignando lista de lineas al objeto venta creado
       			reporteVentaDetalleObtenido.setListaLineaVentaDetalle(listaLineaReporteVentaDetalleResultado);

       			if (logger.isDebugEnabled() && listaLineaReporteVentaDetalleResultado != null) {
       				logger.debug("sizeLineas=" + listaLineaReporteVentaDetalleResultado.size());
       			}
       		}

       		return reporteVentaDetalleObtenido;
       	}

	public AjusteInventario obtenerAjusteInventarioSobrantes(Inventario inventario){
		logger.info("obtenerAjusteInventarioSobrantes");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_AJUSTE_SOBRANTES_X_TIENDA)
				.returningResultSet(LISTADO, new RowMapper<AjusteInventario>() {
							@Override
							public AjusteInventario mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final AjusteInventario ajusteInventario = new AjusteInventario();

								Inventario inventario = new Inventario();
								inventario.setCodInventario(rs.getInt(INVENTARIO_CODINVENTARIO));
								
								Tienda tienda = new Tienda();
								tienda.setCodigo(rs.getInt(INVENTARIO_CODTIENDA));
								tienda.setDescripcion(rs.getString(INVENTARIO_TIENDA));
								inventario.setTienda(tienda);
												
								ajusteInventario.setInventario(inventario);

								return ajusteInventario;
							}
						})
				.returningResultSet(LISTADO_LINEAS, new RowMapper<LineaAjusteInventario>() {
							@Override
							public LineaAjusteInventario mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final LineaAjusteInventario lineaAjusteInventario = new LineaAjusteInventario();

								Producto producto = new Producto();
								producto.setCodigo(rs.getInt(AJUSTE_CODPRODUCTO));
								producto.setCodProductoProveedor(rs.getString(AJUSTE_CODPRODUCTOPROVEEDOR));
								producto.setDescripcion(rs.getString(AJUSTE_DESCRIPCION));
												
								lineaAjusteInventario.setProducto(producto);

								lineaAjusteInventario.setcantidadSobrantes(rs.getInt(AJUSTE_CANTIDADSOBRANTES));
						

								return lineaAjusteInventario;					
								
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource().addValue(
				PARAM_CODTIENDA, inventario.getTienda().getCodigo()).addValue(
				PARAM_CODINVENTARIO, inventario.getCodInventario());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Declarando objeto ajusteInventario Obtenido
		AjusteInventario ajusteInventarioObtenido = new AjusteInventario();

	   // Obteniendo lista de lineas generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<LineaAjusteInventario> listaLineaAjusteInventario = (List<LineaAjusteInventario>) data.get(LISTADO_LINEAS);

			// Instanciando objeto ListaLineaAjusteInventario
			ListaLineaAjusteInventario listaLineaAjusteInventarioResultado = new ListaLineaAjusteInventario();
			// Estableciendo resultado al objeto
			listaLineaAjusteInventarioResultado.setLista(listaLineaAjusteInventario);
			
			// Asignando lista de lineas al objeto inventario creado
			ajusteInventarioObtenido.setListaLineaAjusteInventario(listaLineaAjusteInventarioResultado);
			

			if (logger.isDebugEnabled() && listaLineaAjusteInventarioResultado != null) {
				logger.debug("sizeLineas="+ listaLineaAjusteInventarioResultado.size());
		}

		return ajusteInventarioObtenido;
	}
	
	public AjusteInventario obtenerAjusteInventarioFaltantes(Inventario inventario){
		logger.info("obtenerAjusteInventarioFaltantes");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_AJUSTE_FALTANTES_X_TIENDA)
				.returningResultSet(LISTADO, new RowMapper<AjusteInventario>() {
							@Override
							public AjusteInventario mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final AjusteInventario ajusteInventario = new AjusteInventario();

								Inventario inventario = new Inventario();
								inventario.setCodInventario(rs.getInt(INVENTARIO_CODINVENTARIO));
								
								Tienda tienda = new Tienda();
								tienda.setCodigo(rs.getInt(INVENTARIO_CODTIENDA));
								tienda.setDescripcion(rs.getString(INVENTARIO_TIENDA));
								inventario.setTienda(tienda);

								ajusteInventario.setInventario(inventario);

								return ajusteInventario;
							}
						})
				.returningResultSet(LISTADO_LINEAS, new RowMapper<LineaAjusteInventario>() {
							@Override
							public LineaAjusteInventario mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final LineaAjusteInventario lineaAjusteInventario = new LineaAjusteInventario();

								Producto producto = new Producto();
								producto.setCodigo(rs.getInt(AJUSTE_CODPRODUCTO));
								producto.setCodProductoProveedor(rs.getString(AJUSTE_CODPRODUCTOPROVEEDOR));
								producto.setDescripcion(rs.getString(AJUSTE_DESCRIPCION));
																			
								lineaAjusteInventario.setProducto(producto);
								lineaAjusteInventario.setcantidadFaltantes(rs.getInt(AJUSTE_CANTIDADFALTANTES));
						
								return lineaAjusteInventario;	
						
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource().addValue(
				PARAM_CODTIENDA, inventario.getTienda().getCodigo()).addValue(
				PARAM_CODINVENTARIO, inventario.getCodInventario());

		// Establecer parametros y ejecutar SP
				Map<String, Object> data = llamarSP.execute(parametros);

				// Declarando objeto ajusteInventario Obtenido
				AjusteInventario ajusteInventarioObtenido = new AjusteInventario();

			   // Obteniendo lista de lineas generada de ejecutar SP
					@SuppressWarnings("unchecked")
					List<LineaAjusteInventario> listaLineaAjusteInventario = (List<LineaAjusteInventario>) data.get(LISTADO_LINEAS);

					// Instanciando objeto ListaLineaAjusteInventario
					ListaLineaAjusteInventario listaLineaAjusteInventarioResultado = new ListaLineaAjusteInventario();
					// Estableciendo resultado al objeto
					listaLineaAjusteInventarioResultado.setLista(listaLineaAjusteInventario);
					
					// Asignando lista de lineas al objeto inventario creado
					ajusteInventarioObtenido.setListaLineaAjusteInventario(listaLineaAjusteInventarioResultado);
					

					if (logger.isDebugEnabled() && listaLineaAjusteInventarioResultado != null) {
						logger.debug("sizeLineas="+ listaLineaAjusteInventarioResultado.size());
				}

				return ajusteInventarioObtenido;
				
	}
	
	//Listas
	
	public AjusteInventario obtenerListaItemSobrantes(Inventario inventario){
		logger.info("obtenerListaItemSobrantes");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_LISTAR_PRODUCTO_ITEMS_SOBRANTES)
				.returningResultSet(LISTADO, new RowMapper<AjusteInventario>() {
							@Override
							public AjusteInventario mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final AjusteInventario ajusteInventario = new AjusteInventario();

								Inventario inventario = new Inventario();
								inventario.setCodInventario(rs.getInt(INVENTARIO_CODINVENTARIO));
								
								Tienda tienda = new Tienda();
								tienda.setCodigo(rs.getInt(INVENTARIO_CODTIENDA));
								tienda.setDescripcion(rs.getString(INVENTARIO_TIENDA));
								inventario.setTienda(tienda);
												
								ajusteInventario.setInventario(inventario);

								return ajusteInventario;
							}
						})
				.returningResultSet(LISTADO_LINEAS, new RowMapper<LineaAjusteInventario>() {
							@Override
							public LineaAjusteInventario mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final LineaAjusteInventario lineaAjusteInventario = new LineaAjusteInventario();

								Item item = new Item();
								item.setCodItem(rs.getInt(LISTAITEM_CODITEM));
								item.setCodificacion(rs.getString(LISTAITEM_CODIFICACION));
														
								lineaAjusteInventario.setItem(item); 		

								return lineaAjusteInventario;					
								
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource().addValue(
				PARAM_CODTIENDA, inventario.getTienda().getCodigo()).addValue(
				PARAM_CODINVENTARIO, inventario.getCodInventario());

		// Establecer parametros y ejecutar SP
		Map<String, Object> data = llamarSP.execute(parametros);

		// Declarando objeto ajusteInventario Obtenido
		AjusteInventario ajusteInventarioObtenido = new AjusteInventario();

	   // Obteniendo lista de lineas generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<LineaAjusteInventario> listaLineaAjusteInventario = (List<LineaAjusteInventario>) data.get(LISTADO_LINEAS);

			// Instanciando objeto ListaLineaAjusteInventario
			ListaLineaAjusteInventario listaLineaAjusteInventarioResultado = new ListaLineaAjusteInventario();
			// Estableciendo resultado al objeto
			listaLineaAjusteInventarioResultado.setLista(listaLineaAjusteInventario);
			
			// Asignando lista de lineas al objeto inventario creado
			ajusteInventarioObtenido.setListaLineaAjusteInventario(listaLineaAjusteInventarioResultado);
			

			if (logger.isDebugEnabled() && listaLineaAjusteInventarioResultado != null) {
				logger.debug("sizeLineas="+ listaLineaAjusteInventarioResultado.size());
		}

		return ajusteInventarioObtenido;
	}
	
	public AjusteInventario obtenerListaItemFaltantes(Inventario inventario){
		logger.info("obtenerListaItemFaltantes");

		// Instanciando variable para llamado de SP
		SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
				.withProcedureName(SP_LISTAR_PRODUCTO_ITEMS_FALTANTES)
				.returningResultSet(LISTADO, new RowMapper<AjusteInventario>() {
							@Override
							public AjusteInventario mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final AjusteInventario ajusteInventario = new AjusteInventario();

								Inventario inventario = new Inventario();
								inventario.setCodInventario(rs.getInt(INVENTARIO_CODINVENTARIO));
								
								Tienda tienda = new Tienda();
								tienda.setCodigo(rs.getInt(INVENTARIO_CODTIENDA));
								tienda.setDescripcion(rs.getString(INVENTARIO_TIENDA));
								inventario.setTienda(tienda);

								ajusteInventario.setInventario(inventario);

								return ajusteInventario;
							}
						})
				.returningResultSet(LISTADO_LINEAS, new RowMapper<LineaAjusteInventario>() {
							@Override
							public LineaAjusteInventario mapRow(final ResultSet rs, final int numRow) throws SQLException {
								final LineaAjusteInventario lineaAjusteInventario = new LineaAjusteInventario();

								Item item = new Item();
								item.setCodItem(rs.getInt(LISTAITEM_CODITEM));
								item.setCodificacion(rs.getString(LISTAITEM_CODIFICACION));
														
								lineaAjusteInventario.setItem(item); 		

								return lineaAjusteInventario;		
						
							}
						});
		// Estableciendo parametros de entrada al SP
		SqlParameterSource parametros = new MapSqlParameterSource().addValue(
				PARAM_CODTIENDA, inventario.getTienda().getCodigo()).addValue(
				PARAM_CODINVENTARIO, inventario.getCodInventario());

		// Establecer parametros y ejecutar SP
				Map<String, Object> data = llamarSP.execute(parametros);

				// Declarando objeto ajusteInventario Obtenido
				AjusteInventario ajusteInventarioObtenido = new AjusteInventario();

			   // Obteniendo lista de lineas generada de ejecutar SP
					@SuppressWarnings("unchecked")
					List<LineaAjusteInventario> listaLineaAjusteInventario = (List<LineaAjusteInventario>) data.get(LISTADO_LINEAS);

					// Instanciando objeto ListaLineaAjusteInventario
					ListaLineaAjusteInventario listaLineaAjusteInventarioResultado = new ListaLineaAjusteInventario();
					// Estableciendo resultado al objeto
					listaLineaAjusteInventarioResultado.setLista(listaLineaAjusteInventario);
					
					// Asignando lista de lineas al objeto inventario creado
					ajusteInventarioObtenido.setListaLineaAjusteInventario(listaLineaAjusteInventarioResultado);
					

					if (logger.isDebugEnabled() && listaLineaAjusteInventarioResultado != null) {
						logger.debug("sizeLineas="+ listaLineaAjusteInventarioResultado.size());
				}

				return ajusteInventarioObtenido;
				
	}
	
}
